package com.winner.data.annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

/**
 * 第一步: 新建自定义注解类
 * 第二步: 新建切面处理类, 即OperationAspect类. Spirng-AOP配合自定义注解一起使用, 当然你可以不用自定义注解来配置 @Pointcut 也可以使用其他形式的
 * Pointcut表达式 (如: "execution(public * com.elim..*.add*(..))" 匹配所有com.elim包及其子包下所有类的以add开头的所有public方法)
 * 或加了Controller注解的作为切面表达式@Before("@within(org.springframework.web.bind.annotation.RestController)"
 * || @within(org.springframework.stereotype.Controller)")
 *
 * @Pointcut表达式参数可以参考如下连接: https://blog.csdn.net/elim168/article/details/78150438
 *
 * 第三步: 如何使用自定义注解, 在controller方法上, 加如下注解即可.
 *
 * @author wangxinle5
 * @since 2023-01-03
 */
@Slf4j
@Component
@Aspect
public class OperationAspect {

    /**
     * 强调@annotation()括号中的值，需要和方法参数名相同, 必须都是operation
     *
     * @param joinPoint
     * @param operation
     */
    @Before("@annotation(operation)")
    public void action(JoinPoint joinPoint, Operation operation) {
        Object target = joinPoint.getTarget();
        Object aThis = joinPoint.getThis();
        log.info("目标对象即原对象target, cglib代理对象this, 可以debug查看");
        // 打印自定义注解传入的参数
        log.info("打印自定义注解传入的参数：" + operation.name() + "--------" + operation.arr()[0] + "--------");
    }
}
